Java-Note-JVN-Could-not-reserve-enough-space-for-heap

  • 问题: Could not reserve enough space for object heap
  • 答案: 系统默认分配的堆内存不够, 可在catalina.sh开头添加: JAVA_OPTS=”-Xmx1024m”. 其中1024可以更改
Read More

Java-Note-JVM-Cannot-find-seclasspath-sh

  • 问题: Cannot find /users/ems/tomcat/bin/setclasspath.sh
  • 原因: 跟环境变量有关, 在catalina.sh中的配置和/etc/profile中的配置不匹配
Read More

Java-Note-Debug-使用Intellij对应用进行远程调试

  • 环境配置
    • 远程服务器
      • 操作系统: centos 6.5
      • tomcat版本: 8.0
  • 步骤

    1. 打开端口8000(如果是云服务器还需打开8000端口的入站流量)
    2. 修改远程tomcat服务器配置: 使用catalina.sh代替startup.sh来启动

      1. 关闭远程tomcat:

        1
        2
        cd /var/tomcat/tomcat-8/bin
        ./shutdown.sh
      2. 修改catalina.sh中的代码, 将

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        if [ "$1" = "jpda" ] ; then
        if [ -z "$JPDA_TRANSPORT" ]; then
        JPDA_TRANSPORT="dt_socket"
        fi
        if [ -z "$JPDA_ADDRESS" ]; then
        JPDA_ADDRESS="localhost:8000"
        fi
        if [ -z "$JPDA_SUSPEND" ]; then
        JPDA_SUSPEND="n"
        fi
        if [ -z "$JPDA_OPTS" ]; then
        JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
        fi
        CATALINA_OPTS="$CATALINA_OPTS $JPDA_OPTS"
        shift
        fi

        中的JPDA_ADDRESS="localhost:8000"改为JPDA_ADDRESS="0.0.0.0:8000". 因为0.0.0.0表示所有的ip地址都可以访问, JPDA是指Java Platform Debugger Architecture, 是一种专门用于Java调试的架构: JPDA.

      3. 重启tomcat: ./catalina.sh jpda start
    3. 修改本地Intellij配置
      1. Edit Configuration中增加一个Remote, 将里面的Port改为8000, 保存然后点击debug按钮
      2. 当出现Connected to the target VM, address: '140.143.29.99:8000', transport: 'socket'时表示远程连接调试端口成功, 可以开始调试
  • 注意: 在步骤3的1中, 如果出现Unable to open debugger port (x.x.x.x:8000): java.net.ConnectException "Connection refused: connect"说明调试端口为对客户端开放, 此时可以在远程服务器上使用netstat -ntlp查看开放的端口, 有可能没有开放8000端口或者开放的是127.0.0.1:8000而不是0.0.0.0:8000

Java-Note-Spring-415-Unsupported-Media-Type

  • 用postman向服务端发送请求时报错, 使用的content-typeapplication/json:

    1
    2
    3
    HTTP Status 415 – Unsupported Media Type
    Type Status Report
    Description The origin server is refusing to service the request because the payload is in a format not supported by this method on the target resource.
  • 原因:

    1. 在请求头中未加入Content-Type:application/json
    2. 如果排除1依然报错, 则是因为没有相应的处理json的包, 如com.google.code.gson/com.fasterxml.jackson.core. 如果没有这类包, 则依旧会报这个错误, 因为java和spring自己没有解析json的功能, 需要借助第三方包

Java-Note-JVM-Java堆和Native堆

  • Native堆属于非Java堆
    • 引入原因: JVM与外界通讯, 把Java堆中的内容传输到外界, 需要把Java堆复制到非Java堆, 如果使用Native堆并在Java堆中保存其引用, 可以避免内容在Java堆和非Java堆之间的copy
    • 注意
      • 非Java堆得回收不受Java young gc的影响, 需要手工回收. 大量使用丢失Java自动垃圾回收的特点
      • 一般使用费Java堆进行和外界的通讯, 并且作为缓存使用. 如DirectByteBuffer

Java-Note-Reference

Java-Note-引用

  • 引用:

    • C++中的引用: 与指针相比:
      1. 没有null 引用
      2. 引用必须有初值
      3. 使用引用要比使用指针效率高, 因为引用不用测试其有效性
      4. 指针可以重新赋值, 而引用总是指向它最初获得的对象
    • Java中的引用: 与C++中的引用相比, 不过是穿着引用外衣的指针而已
    • 例子:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      public class ValueTransmit {
      public static void main(String[] args) {
      ValueObject valueObject1 = new ValueObject();
      System.out.println("old preprocess: " + valueObject1.value);
      changeOldObject(valueObject1);
      System.out.println("old processed: " + valueObject1.value);
      ValueObject valueObject2 = new ValueObject();
      System.out.println("new preprocess: " + valueObject2.value);
      changeNewObject(valueObject2);
      System.out.println("new processed: " + valueObject2.value);
      }

      public static void changeOldObject(ValueObject valueObject) {
      valueObject.value = 5;
      System.out.println("old processing: " + valueObject.value);
      }

      public static void changeNewObject(ValueObject valueObject) {
      valueObject = new ValueObject();
      valueObject.value = 5;
      System.out.println("new processing: " + valueObject.value);
      }
      }

      class ValueObject {
      public int value;

      public ValueObject() {
      value = 1;
      }
      }/* Output:
      old preprocess: 1
      old processing: 5
      old processed: 5
      new preprocess: 1
      new processing: 5
      new processed: 1
      *///:~
    • 疑问: 为何把valueObject引用指向一个new ValueObject后, 处理的结果没有发生变化呢

    • 答案: 因为方法参数是将实际参数复制一份压入栈中, 而valueObject引用如果指向的是new ValueObject的话, value的改变发生在new ValueObject, 而不是old ValueObject

Java-Note-Spring-Autowired

  • @Autowired: 可以将指定bean自动注入, 以避免使用<bean>下面的<preporty>来设置
  • 使用@Autowired需要在xml中配置<context:annotation-config> 标签
    • <context:annotation-config> is used to activate annotations in beans already registered in the application context (no matter if they were defined with XML or by package scanning). and <context:component-scan> can also do what <context:annotation-config> does but <context:component-scan> also scans packages to find and register beans within the application context.
Read More

XML-Note-相关知识

  • XSD: XML Schema Defination, is a World Wide Web Consortium(W3C) recommendation that specifies how to formally describe the elements in an Extensible Markup Language(XML) document
  • beans标签中的属性:

Read More

Java-Note-通过相对位置读取文件

  • 项目代码中:
    • 想要读取项目下的文件, 又不希望写死路径, 可以把路径写为: “src/…”
  • 浏览器中: 浏览器中读取服务器的文件
    • 在tomcat的service.xml进行一下修改(Context标签):
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      <Host name="localhost"  appBase="webapps"
      unpackWARs="true" autoDeploy="true">
      <Context path="/custom_api/static" docBase="\custom_api\WEB-INF\static"
      reloadable="true" debug="0"/>
      <Context path="/custom_api" docBase="D:\runtime\jnScience"
      reloadable="true" debug="0"/>
      <!-- SingleSignOn valve, share authentication between web applications
      Documentation at: /docs/config/valve.html -->
      <!--
      <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
      -->

      <!-- Access log processes all example.
      Documentation at: /docs/config/valve.html
      Note: The pattern used is equivalent to using pattern="common" -->
      <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
      prefix="localhost_access_log" suffix=".txt"
      pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>